home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / apps / xconf / ConfList.c++ < prev    next >
C/C++ Source or Header  |  1994-08-01  |  10KB  |  350 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. //
  19. //  Class:        ConfList
  20. //  Base Classes:       none
  21. //  Author:             Jesse Rendleman (jesse@sgi.com)
  22. //
  23.  
  24. // unix includes
  25. #include <sys/types.h>
  26. #include <malloc.h>
  27.  
  28. // motif includes
  29. #include <Xm/Form.h>
  30. #include <Xm/Frame.h>
  31. #include <Xm/List.h>
  32. #include <Xm/Label.h>
  33. #include <Xm/SelectioB.h>
  34.  
  35. // conf includes
  36. #include "ConfDoc.h"
  37.  
  38. ConfList::ConfList()
  39. {
  40.   _numItems = 0;
  41. }
  42.  
  43.  
  44. ConfList::~ConfList() {}
  45.  
  46.  
  47. void ConfList::init(Widget parent, char *title)
  48. {
  49.   char buf[16];
  50.  
  51.   // build the widgets
  52.   strcpy(buf, title);
  53.   strcat(buf, "Dialog");
  54.   _dWidget = XmCreateSelectionDialog(parent, buf, NULL, 0);
  55.   XtAddCallback(_dWidget, XmNokCallback,
  56.         (XtCallbackProc)&ConfList::okCB,
  57.         (XtPointer)this);
  58.   XtAddCallback(_dWidget, XmNcancelCallback,
  59.         (XtCallbackProc)&ConfList::cancelCB,
  60.         (XtPointer)this);
  61.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_TEXT));
  62.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_SELECTION_LABEL));
  63.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_CANCEL_BUTTON));
  64.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_APPLY_BUTTON));
  65.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_HELP_BUTTON));
  66.  
  67.   _listWidget = XmSelectionBoxGetChild(_dWidget, XmDIALOG_LIST);
  68.  
  69.   // kludgy, have this passed in later.. (groups, is a multiple select list)
  70.   if(!strcmp(title, "groups")) {
  71.     Arg args[1];
  72.     XtSetArg(args[0], XmNselectionPolicy, XmMULTIPLE_SELECT);
  73.     XtSetValues(_listWidget, args, 1);
  74.   }
  75. }
  76.  
  77.  
  78. void ConfList::open()
  79. {
  80.   XtManageChild(_dWidget);
  81. }
  82.  
  83.  
  84. void ConfList::clear()
  85. {
  86.   XmListDeleteAllItems(_listWidget);
  87. }
  88.  
  89.  
  90. void ConfList::okCB(Widget, XtPointer clientData, XtPointer)
  91. {
  92.   ConfList* obj = (ConfList*)clientData;
  93.  
  94.   XtUnmanageChild(obj->_dWidget);
  95. }
  96.  
  97.  
  98. void ConfList::cancelCB(Widget, XtPointer clientData, XtPointer)
  99. {
  100.   ConfList* obj = (ConfList*)clientData;
  101.  
  102.   XtUnmanageChild(obj->_dWidget);
  103. }
  104.  
  105.  
  106. Boolean ConfList::add(char *item, Boolean select)
  107. {
  108.   XmString itemString = XmStringCreate(item, XmSTRING_DEFAULT_CHARSET);
  109.   _numItems++;
  110.   XmListAddItem(_listWidget, itemString, _numItems);
  111.   if(select) {
  112.     strcpy(_item, item);
  113.     XmListSelectItem(_listWidget, itemString, FALSE);
  114.   }
  115.   XmStringFree(itemString);
  116.   return(TRUE);
  117. }
  118.  
  119.  
  120. Boolean ConfList::select(char *item)
  121. {
  122.   if(find(item)) {
  123.     XmString itemString = XmStringCreate(item, XmSTRING_DEFAULT_CHARSET);
  124.     XmListDeselectItem(_listWidget, itemString);
  125.     XmListSelectItem(_listWidget, itemString, FALSE);
  126.     XmStringFree(itemString);
  127.     return(TRUE);
  128.   }
  129.   else {
  130.     return(FALSE);
  131.   }
  132. }
  133.  
  134.  
  135. Boolean ConfList::remove(char *item)
  136. {
  137.   XmString itemString = XmStringCreate(item, XmSTRING_DEFAULT_CHARSET);
  138.   if(XmListItemExists(_listWidget, itemString)) {
  139.     XmListDeleteItem(_listWidget, itemString);
  140.     _numItems--;
  141.     XmStringFree(itemString);
  142.     return(TRUE);
  143.   }
  144.   XmStringFree(itemString);
  145.   return(FALSE);
  146. }
  147.  
  148.  
  149. Boolean ConfList::find(char *item)
  150. {
  151.   XmString itemString = XmStringCreate(item, XmSTRING_DEFAULT_CHARSET);
  152.   if(XmListItemExists(_listWidget, itemString)) {
  153.     XmStringFree(itemString);
  154.     return(TRUE);
  155.   }
  156.   XmStringFree(itemString);
  157.   return(FALSE);
  158. }
  159.  
  160.  
  161. Boolean ConfList::findSelected(char *item)
  162. {
  163.   XmString itemString = XmStringCreate(item, XmSTRING_DEFAULT_CHARSET);
  164.   int pos = XmListItemPos(_listWidget, itemString);
  165.   int* pos_list;
  166.   int pos_cnt;
  167.   if(!XmListGetSelectedPos(_listWidget, &pos_list, &pos_cnt)) {
  168.     XmStringFree(itemString);
  169.     return(FALSE);
  170.   }
  171.  
  172.   for(int n=0; n<pos_cnt; n++) {
  173.     if(*pos_list == pos) {
  174.       free(pos_list);
  175.       XmStringFree(itemString);
  176.       return(TRUE);
  177.     }
  178.     pos_list++;
  179.   }
  180.   free(pos_list);
  181.   XmStringFree(itemString);
  182.   return(FALSE);
  183. }
  184.  
  185.  
  186. ///////////////////////////////////////////////////////////////////////////////
  187. // GroupList functions
  188. ///////////////////////////////////////////////////////////////////////////////
  189.  
  190. GroupList::GroupList()
  191. {
  192.   _numItems = 0;
  193. }
  194.  
  195.  
  196. GroupList::~GroupList() {}
  197.  
  198.  
  199. void GroupList::init(Widget parent, char *title, ConfDoc* confdoc)
  200. {
  201.   char buf[16];
  202.  
  203.   // set the pointer to the ConfDoc
  204.   _confdoc = confdoc;
  205.  
  206.   // build the widgets
  207.   strcpy(buf, title);
  208.   strcat(buf, "Dialog");
  209.   _dWidget = XmCreateSelectionDialog(parent, buf, NULL, 0);
  210.   XtAddCallback(_dWidget, XmNokCallback,
  211.         (XtCallbackProc)&GroupList::okCB,
  212.                 (XtPointer)this);
  213.   XtAddCallback(_dWidget, XmNcancelCallback,
  214.         (XtCallbackProc)&GroupList::cancelCB,
  215.                 (XtPointer)this);
  216.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_TEXT));
  217.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_SELECTION_LABEL));
  218.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_APPLY_BUTTON));
  219.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_HELP_BUTTON));
  220.  
  221.   _listWidget = XmSelectionBoxGetChild(_dWidget, XmDIALOG_LIST);
  222. }
  223.  
  224.  
  225. void GroupList::okCB(Widget, XtPointer clientData, XtPointer callData)
  226. {
  227.   GroupList* obj = (GroupList*)clientData;
  228.   XmSelectionBoxCallbackStruct* cd = (XmSelectionBoxCallbackStruct*)callData;
  229.  
  230.   // only try to switch groups if a new group was selected
  231.   char* gp;
  232.   XmStringGetLtoR(cd->value, XmSTRING_DEFAULT_CHARSET, &gp);
  233.   if(strlen(gp) && strcmp(obj->_item, gp)) {
  234.     strcpy(obj->_item, gp);
  235.     char new_group[33];
  236.     strcpy(new_group, ":g ");
  237.     strcat(new_group, obj->_item);
  238.     obj->_confdoc->setGroup(new_group);
  239.   }
  240.  
  241.   XtUnmanageChild(obj->_dWidget);
  242. }
  243.  
  244.  
  245. ///////////////////////////////////////////////////////////////////////////////
  246. // PrivateList functions
  247. ///////////////////////////////////////////////////////////////////////////////
  248.  
  249. PrivateList::PrivateList()
  250. {
  251.   _numItems = 0;
  252. }
  253.  
  254.  
  255. PrivateList::~PrivateList() {}
  256.  
  257.  
  258. void PrivateList::init(Widget parent, char* title, char* usr, ConfDoc* confdoc)
  259. {
  260.   Arg args[5];  // make sure this is large enough
  261.   char buf[16];
  262.  
  263.   // set the pointer to the ConfDoc
  264.   _confdoc = confdoc;
  265.   
  266.   // set the user this channel is for
  267.   strcpy(_user, usr);
  268.  
  269.   // build the widgets
  270.   strcpy(buf, title);
  271.   strcat(buf, "Dialog");
  272.   _dWidget = XmCreateSelectionDialog(parent, buf, NULL, 0);
  273.   XtAddCallback(_dWidget, XmNokCallback,
  274.                 (XtCallbackProc)&PrivateList::closeCB,
  275.                 (XtPointer)this);
  276.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_LIST));
  277.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_TEXT));
  278.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_SELECTION_LABEL));
  279.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_APPLY_BUTTON));
  280.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_CANCEL_BUTTON));
  281.   XtUnmanageChild(XmSelectionBoxGetChild(_dWidget, XmDIALOG_HELP_BUTTON));
  282.  
  283.   // create the form, that all the widgets will go in.
  284.   strcpy(buf, title);
  285.   strcat(buf, "Form");
  286.   Widget form = XmCreateForm(_dWidget, buf, NULL, 0);
  287.   XtManageChild(form);
  288.  
  289. // create a frame for the text input area
  290.   int n = 0;
  291.   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);  n++;
  292.   XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
  293.   XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);  n++;
  294.   Widget privateFrame = XmCreateFrame(form, "privateFrame", args, n);
  295.   XtManageChild(privateFrame);
  296.  
  297. // create a text input area
  298.   n = 0;
  299.   XtSetArg(args[n], XmNorientation, XmHORIZONTAL);  n++;
  300.   Widget privateForm = XmCreateForm(privateFrame, "private2Form", args, n);
  301.   XtManageChild(privateForm);
  302.  
  303. // create the text input prompt
  304.   n = 0;
  305.   XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
  306.   XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);  n++;
  307.   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);  n++;
  308.   Widget privatePrompt = XmCreateText(privateForm, "privatePrompt", args, n);
  309.   XtManageChild(privatePrompt);
  310.   XmTextSetString(privatePrompt, "msg>");
  311.  
  312. // create the text input field
  313.   n = 0;
  314.   XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);  n++;
  315.   XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);  n++;
  316.   XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);  n++;
  317.   XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET);  n++;
  318.   XtSetArg(args[n], XmNleftWidget, privatePrompt);  n++;
  319.   _privateText = XmCreateText(privateForm, "privateText", args, n);
  320.   XtManageChild(_privateText);
  321.   XtAddCallback(_privateText, XmNactivateCallback,
  322.         (XtCallbackProc)&PrivateList::sendCB,
  323.         (XtPointer)_confdoc);
  324. }
  325.  
  326.  
  327. void PrivateList::closeCB(Widget, XtPointer clientData, XtPointer callData)
  328. {
  329.   PrivateList* obj = (PrivateList*)clientData;
  330.  
  331.   XtUnmanageChild(obj->_dWidget);
  332.   delete obj;
  333. }
  334.  
  335.  
  336. void PrivateList::sendCB(Widget, XtPointer clientData, XtPointer callData)
  337. {
  338.   PrivateList* obj = (PrivateList*)clientData;
  339.   char buf[256];
  340.  
  341.   char *tmp = XmTextGetString(obj->_privateText);
  342.   strcpy(buf, ":p ");
  343.   strcat(buf, obj->_user);
  344.   strcat(buf, tmp);
  345.  
  346.   obj->_confdoc->sendPrivate(buf, 0);
  347. }
  348.  
  349.  
  350.